INTRODUÇÃO AO R

Autor

João Ricardo F. de Lima

Data de Publicação

16 de julho de 2024


Por que usar o R?


  1. O R É uma linguagem de programação usada principalmente para estatística computacional;
  2. O R É gratuito;
  3. O R É um substituto mais do que perfeito do Excel;
  4. Existe uma comunidade incrível trabalhando na plataforma. Existem mais de 500 blogs e sites que tratam de R;
  5. É possível unificar todas as operações em um mesmo ambiente, automatizando as rotinas;
  6. Não é uma linguagem voltada apenas para estatísticos;
  7. Liberdade maior para se apresentar os resultados;
  8. O R É excelente para se fazer gráficos de alta qualidade.


Instalação do R?


O R pode ser baixado no site http://www.r-project.org. A versão atual é a 4.4.1, mas constantemente são lançadas novas versões. Para uma melhor interface com o usuário, recomenda-se usar um outro software, chamado R-Studio, que pode ser baixado no site http://www.rstudio.com. O R deve ser instalado primeiro e depois o R Studio. O R Studio não funciona se o R não tiver sido instalado.


RStudio


Quando se abre o RStudio, é possível ver quatro áreas. Na parte esquerda superior se digita as linhas de comando para o R executar. Na parte esquerda inferior (console) é mostrado o output, ou seja, os resultados. É possível digitar os comandos no console também e funciona como uma calculadora. Na parte direita superior é onde se pode ver uma lista de objetos do R. Na parte direita inferior se pode ver os arquivos, gráficos, pacotes instalados e a ajuda (help).


Packages


O que são “pacotes”? R é construído em torno de pacotes (arquivos que contém comandos para realizar uma tarefa específica), tem uma estrutura (que inclui um número de pacotes) e contribuições de algoritmos feitos por usuários do mundo inteiro. Existem muitos pacotes que já vem no R. Existem também diversas contribuições que não estão embutidas na instalação do R. É necessário ir em locais específicos para encontrá-los:


  1. CRAN (Central R Network);
  2. GitHub


Como acessar as funções dos pacotes


Após a instalação dos pacotes [install.packages("nome do pacote")] é necessário “carregá-lo” para a memória do R. Os pacotes estão intalados mas não são carregados automaticamente. Para carregar, usar o comando library(nome do pacote). Geralmente se coloca todos os pacotes a serem utilizados na parte de cima do script.

Se o pacote não existir no computador, o R retorna uma mensagem de erro -\(>\) Error: could not find function “nome do pacote”;

O R é “case sensitive”, ou seja, se o comando estiver escrito em maiúsculo e a pessoa digitar minúsculo, ele não reconhece. O uso de “#” indica que o escrito na linha é apenas um comentário.


Help


Como usar o Help? A forma mais simples é ?? na frente do que se deseja obter ajuda. Outra possibilidade é recorrer a internet. Existem centenas de sites em português ou inglês com soluções para problemas encontrados em R:


  1. https://www.r-bloggers.com/
  2. http://stackoverflow.com/
  3. https://stats.idre.ucla.edu/r/
  4. https://analisereal.com/
  5. https://sites.google.com/site/marcosfs2006/


Dicas


Usando as setas do teclado é possível acessar o histórico de comandos, repetir um comando ou corrigir um comando escrito incorretamente, sem precisar digitar tudo novamente. Tudo no R é um objeto. É como a lógica do programa funciona. Assim, ao invés de tabular um resultado, para o R se está criando uma tabela, por exemplo.

Os objetos do R podem ser variáveis, arranjos de números, funções, etc., sendo criados e armazenados por um nome. Uma coleção de objetos armazenados se chama workspace. A lista de objetos armazenados pode ser visualizada com o comando objects() ou list().

Os comandos no R são escritos da mesma forma, tendo um nome e, entre parentes, as opções diversas e os dados nomedafuncao(parte1, parte2, etc). A função rm() deve ser utilizada para se remover objetos. A função rm(list=ls() apaga todos os objetos.

Todos os objetos criados em uma sessão do R podem ser armazenados em um arquivo para uso em sessões futuras. No final de toda sessão, o R pergunta se quer salvar os objetos disponíveis. Caso se queira, o R vai criar um arquivo .RData no diretório e as linhas de comandos serão guardadas em .Rhistory. O ideal é que se tenha um diretório para cada análise realizada no R.


R como uma calculadora


R pode ser usado como uma calculadora, digitando diretamente no “prompt” e apertando “Run” ou Ctrl+Enter:

# adição
2+1 
[1] 3
# subtração
2-1 
[1] 1
# multiplicação
2*1 
[1] 2
# divisão
2/1
[1] 2
# potenciação
2^2  
[1] 4

Regras normais de cálculo se aplicam:

2+2*3
[1] 8
(2+2)*3
[1] 12

O R pode gerar números aleatórios

x <- rnorm(10, mean=0, sd=1)

R contém muitas funções matemáticas:

# logaritmo natural, 2.3  
log(10) 
[1] 2.302585
# exponencial
exp(2.3)  
[1] 9.974182
# raiz quadrada
sqrt(9) 
[1] 3

R também possui os operadores:

== igual

> maior

>= maior ou igual

<= menor ou igual

!= diferente

& “e”

| “ou”

Outros elementos importantes são max, min, range (mostra o menor e o maior valor de um vetor), length(x) (mostra o número de elementos no vetor x), sum(x) dá o somatório total de elementos em x.

Duas funções estatísticas importantes são a média e variância de uma variável aleatória e podem ser obtidas através dos comandos mean(x) e var(x). Uma outra forma de obtê-las é fazendo sum(x)/length(x) ou sum((x-mean(x))^2)/(length(x)-1).

sort e sort.list() são comandos que podem ser utilizados para ordenar dados de forma crescente ou decrescente.

Vetores

O R funciona com o que se denomina “estrutura de dados”. A estrutura mais simples é um vetor numérico, que é um objeto constituído de uma coleção ordenada de números. Normalmente, se deseja realizar uma mesma operação para vários números ao mesmo tempo. Assim, primeiramente é necessário criar um objeto vetor que armazena estes números:

v<-c(1,2,3,4,5)
v
[1] 1 2 3 4 5

tudo em R é um objeto, aqui v é um objeto usado para armazenar 5 números, a “seta” é o operador que armazena algo, c() é um comando (função) usado para criar uma lista com os valores a serem guardados.

Vetores podem ser guardados usando :, se os valores forem contínuos:

v<-c(1:5)

v
[1] 1 2 3 4 5

Para criar um vetor com três numeros 1, quatro 2’s, e cinco 3’s, existem várias possibilidades:

v <- c(1,1,1,2,2,2,2,3,3,3,3,3)

v
 [1] 1 1 1 2 2 2 2 3 3 3 3 3
# Using rep( ) 

v1<-rep(1,3) #Cria um vetor com três ``um'' 
v2<-rep(2,4) 
v3<-rep(3,5) 
v<-c(v1,v2,v3) 
v
 [1] 1 1 1 2 2 2 2 3 3 3 3 3
#Reunindo os comandos:
v4<-c(rep(1,3), rep(2,4), rep(3,5))

v4
 [1] 1 1 1 2 2 2 2 3 3 3 3 3

1:30 é a sequência de número de 1 a 30. Se fizer o inverso, 30:1, se tem a sequência de forma decrescente; A função seq() tem várias facilidades para se gerar sequências de números.

s1 <- seq(-5, 5, by=.2)

s1
 [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
[16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8
[31]  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0  3.2  3.4  3.6  3.8
[46]  4.0  4.2  4.4  4.6  4.8  5.0
s2 <- seq(length=51, from=-5, by=.2)
s2
 [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
[16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8
[31]  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0  3.2  3.4  3.6  3.8
[46]  4.0  4.2  4.4  4.6  4.8  5.0

Vetor aritmético

Vetores podem ser usados em expressões matemáticas, que é o caso em que a operação é feita elemento a elemento;

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
x
[1] 10.4  5.6  3.1  6.4 21.7
y <- c(x, 0, x)
y
 [1] 10.4  5.6  3.1  6.4 21.7  0.0 10.4  5.6  3.1  6.4 21.7
v <- 2*x + 1
v
[1] 21.8 12.2  7.2 13.8 44.4

Além do que, quando se aplica qualquer função a um determinado vetor (como em v), a função será executada separadamente para cada observação no vetor.

Valores Faltando

Existem situações que não se tem todos os valores de um vetor, ou seja, ele é um missing value. Nos lugares em que existem estes números faltando, aparece um NA (not available). Qualquer operação envolvendo um NA se torna um NA: 2*NA=NA, por exemplo. Para saber se existe algum NA em um objeto, a função is.na() é muito útil.

z <- c(1:3,NA)
z
[1]  1  2  3 NA
ind <- is.na(z)
ind
[1] FALSE FALSE FALSE  TRUE
# Carrega os pacotes
library(wooldridge)
library(kableExtra)
library(dplyr)

# Carrega a base 'wage2'
data(wage2)

rowSums(is.na(wage2)) #Número de missings por linha
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
  0   1   0   0   0   1   0   1   0   0   0   1   1   0   0   0   0   0   1   1 
 21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
  1   0   0   0   0   0   0   0   0   0   1   0   0   0   0   1   1   0   0   0 
 41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
  0   1   1   0   0   1   0   1   1   0   0   0   0   0   1   0   0   0   0   0 
 61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
  0   0   0   1   2   1   0   1   1   0   0   1   0   0   0   0   1   0   1   0 
 81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
  0   2   0   0   0   1   1   0   0   1   0   0   0   0   0   0   1   0   0   0 
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
  0   0   0   0   1   0   0   0   0   0   0   2   1   1   0   0   1   0   0   1 
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   1 
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
  0   0   0   0   0   1   0   0   0   0   0   0   1   0   0   1   0   1   0   0 
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
  1   0   0   0   0   0   0   1   0   1   2   1   0   0   0   0   0   1   1   1 
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
  0   0   0   0   0   0   0   0   0   0   1   0   1   0   0   0   1   0   0   1 
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
  0   0   0   1   0   2   0   0   1   0   0   0   0   0   0   0   0   0   0   0 
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 
  0   2   1   0   0   1   1   1   2   2   0   2   0   0   0   0   2   0   0   0 
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 
  0   0   1   1   3   0   0   0   1   0   0   0   2   0   0   0   0   0   1   1 
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 
  2   0   1   0   0   0   1   0   1   0   0   1   2   0   1   0   0   0   1   0 
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 
  0   0   0   1   1   0   0   0   0   0   0   0   0   0   2   0   2   1   0   0 
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 
  1   0   0   0   0   0   2   0   0   0   0   0   0   2   0   0   2   0   1   0 
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 
  3   0   1   0   0   0   1   0   0   0   1   0   0   0   0   1   0   0   0   0 
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 
  0   0   1   0   0   0   1   0   0   0   0   2   0   0   0   0   0   0   0   1 
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 
  0   0   0   1   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   0 
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 
  0   0   0   0   2   0   0   0   0   1   0   0   2   0   1   0   0   0   0   1 
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 
  0   0   0   0   0   1   0   1   0   0   0   2   0   2   0   0   1   0   0   0 
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 
  1   0   0   0   2   0   1   0   0   2   0   0   0   1   0   0   0   0   1   0 
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 
  0   0   2   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 
  0   1   1   0   0   1   1   0   0   1   1   0   0   0   0   0   0   0   0   1 
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 
  0   0   0   0   0   1   0   0   0   0   1   0   1   0   1   0   0   1   0   0 
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 
  0   0   2   0   0   0   0   1   0   0   2   0   0   0   1   0   0   1   1   1 
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 
  0   0   1   0   0   0   0   1   0   0   1   0   1   2   1   0   0   0   1   0 
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 
  1   1   0   0   1   0   0   1   0   0   0   0   0   2   1   1   0   0   0   0 
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 
  0   0   0   0   0   1   0   0   0   0   0   2   2   0   0   0   0   0   1   2 
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 
  0   2   0   1   1   0   2   1   1   3   1   0   0   0   0   0   0   0   1   1 
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 
  0   1   0   1   0   2   1   0   2   0   0   0   2   1   1   0   1   0   0   0 
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 
  0   0   2   1   0   0   0   2   2   0   0   0   0   0   0   0   0   0   1   0 
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 
  1   0   0   0   0   0   0   1   0   0   0   1   1   1   0   0   0   2   0   1 
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 
  0   0   0   2   0   0   0   1   1   2   0   1   3   0   0   0   2   1   1   0 
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 
  0   0   1   0   0   0   0   2   0   0   1   0   0   0   2   0   2   0   1   1 
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 
  1   0   0   0   0   0   3   0   0   0   0   0   0   0   0   0   1   0   0   0 
721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 
  0   0   0   0   0   0   1   0   0   0   0   0   0   1   0   0   0   0   0   0 
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 
  0   0   1   0   1   1   1   0   0   1   0   0   1   0   0   0   0   0   0   1 
761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 
  1   0   3   0   0   0   0   0   0   0   0   1   0   0   1   0   0   1   2   0 
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 
  1   0   0   0   0   0   0   0   2   1   0   0   0   1   1   0   0   0   0   0 
801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 
  0   0   2   2   0   1   0   0   0   0   1   2   0   1   0   0   1   0   0   1 
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 
  0   0   0   2   3   0   1   0   0   0   0   1   0   0   0   0   0   0   0   0 
841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 
  0   1   0   1   1   0   0   1   1   0   0   0   0   0   0   0   0   0   1   0 
861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 
  0   0   0   0   1   0   2   0   0   1   2   0   0   0   2   1   2   1   0   0 
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 
  0   0   1   0   2   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0 
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 
  0   0   0   3   2   1   0   1   0   2   1   0   0   0   1   0   0   0   2   0 
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 
  0   2   0   0   0   0   2   1   0   0   1   0   2   1   2 
colSums(is.na(wage2)) #Número de missings por coluna/variável
   wage   hours      IQ     KWW    educ   exper  tenure     age married   black 
      0       0       0       0       0       0       0       0       0       0 
  south   urban    sibs brthord   meduc   feduc   lwage 
      0       0       0      83      78     194       0 
# A função `complete.cases()` retorna um vetor indicando quais variáveis estão completas.
complete.cases(wage2)
  [1]  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
 [13] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE
 [25]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
 [37] FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE
 [49] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
 [61]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
 [73]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
 [85]  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [97] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[109]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
[121]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[133]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
[145]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
[157]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[169]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
[181]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[193] FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
[205]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[217]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
[229] FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[241]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[253] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE
[265]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE
[277]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
[289]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE
[301] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
[313]  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[325]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
[337]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[349]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[361]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
[373]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[385] FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE
[397]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
[409]  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[421] FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
[433]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[445] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[457]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE
[469]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[481]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[493] FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[505]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[517]  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
[529]  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[541] FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
[553]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[565]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
[577]  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
[589] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[601]  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
[613] FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[625]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[637]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[649]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
[661]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE
[673] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[685]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[697] FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[709]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[721]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
[733]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[745] FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[757]  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
[769]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE
[781] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE
[793]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[805]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
[817] FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE
[829]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[841]  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
[853]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
[865] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE
[877] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
[889]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[901]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE
[913]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
[925]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE

Existe um outro tipo de missing value que é gerado de alguma operação numérica, sendo denominado de NaN (not a number). Exemplo é se algum número for dividido por zero ou log de um número negativo.

A função na.omit() cria um objeto com os missing deletados.

# Criando uma nova base de dados sem missing

mydata1 <- na.omit(wage2)

# Trocar valores e renomeando variáveis

mydata1$meduc[mydata1$meduc == 0] <- 0.000001

# Para Renomear uma variável

# Renomear interativamente

colnames(mydata1)[1] <- "salario"


Rótulos nas variáveis


Use factor() para dados binários.

summary(mydata1$married)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  1.0000  1.0000  0.9005  1.0000  1.0000 
mydata1$married <- factor(mydata1$married, levels = c(0,1), 
                       labels = c("não-casado","casado")) 

summary(mydata1$married)
não-casado     casado 
        66        597 

Use ordered() para dados ordenados

data('alcohol')
mydata2 <- alcohol

summary(mydata2$status)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   3.000   3.000   2.829   3.000   3.000 
mydata2$status <- ordered(mydata2$status, levels = c(1,2,3),
                       labels = c("Fora do mercado", "Desempregado",
                                  "Empregado"))
summary(mydata2$status)
Fora do mercado    Desempregado       Empregado 
            684             316            8822 

Todos os objetos no R possuem uma “class”.

  1. numeric
  2. logical
  3. integer
  4. double
  5. factor

Estas classes definem a forma do objeto:

  1. matrix
  2. array
  3. data.frame
  4. tibble
data('alcohol')
mydata2 <- alcohol

glimpse(mydata2)
Rows: 9,822
Columns: 33
$ abuse      <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,…
$ status     <int> 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,…
$ unemrate   <dbl> 4.0, 4.0, 4.0, 3.3, 3.3, 3.3, 6.8, 6.8, 6.8, 6.8, 6.8, 6.8,…
$ age        <int> 50, 37, 53, 59, 43, 38, 34, 45, 47, 31, 43, 46, 36, 29, 32,…
$ educ       <int> 4, 12, 9, 11, 10, 10, 10, 2, 5, 12, 18, 12, 12, 16, 15, 12,…
$ married    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ famsize    <int> 1, 5, 3, 1, 1, 1, 4, 2, 2, 1, 4, 1, 3, 2, 3, 4, 4, 3, 2, 3,…
$ white      <int> 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ exhealth   <int> 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0,…
$ vghealth   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,…
$ goodhealth <int> 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1,…
$ fairhealth <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ northeast  <int> 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ midwest    <int> 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ south      <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ centcity   <int> 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,…
$ outercity  <int> 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ qrt1       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ qrt2       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ qrt3       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ beertax    <dbl> 0.334, 0.334, 0.334, 0.240, 0.240, 0.240, 0.158, 0.158, 0.1…
$ cigtax     <dbl> 38, 38, 38, 26, 26, 26, 20, 20, 20, 20, 20, 20, 20, 14, 14,…
$ ethanol    <dbl> 2.03946, 2.03946, 2.03946, 2.44998, 2.44998, 2.44998, 2.127…
$ mothalc    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ fathalc    <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1,…
$ livealc    <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0,…
$ inwf       <int> 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ employ     <int> 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ agesq      <int> 2500, 1369, 2809, 3481, 1849, 1444, 1156, 2025, 2209, 961, …
$ beertaxsq  <dbl> 0.111556, 0.111556, 0.111556, 0.057600, 0.057600, 0.057600,…
$ cigtaxsq   <dbl> 1444, 1444, 1444, 676, 676, 676, 400, 400, 400, 400, 400, 4…
$ ethanolsq  <dbl> 4.159397, 4.159397, 4.159397, 6.002402, 6.002402, 6.002402,…
$ educsq     <int> 16, 144, 81, 121, 100, 100, 100, 4, 25, 144, 324, 144, 144,…

São importantes para o R pois para cada uma delas o R trabalha de uma maneira diferente.

É possível juntar vetores ou matrizes com os comandos cbind ou rbind. A diferença entre os dois é que o primeiro adiciona uma nova coluna e o segundo, uma linha.

x <- 1:20

y <- 21:40

w <- cbind(x,y)
w
       x  y
 [1,]  1 21
 [2,]  2 22
 [3,]  3 23
 [4,]  4 24
 [5,]  5 25
 [6,]  6 26
 [7,]  7 27
 [8,]  8 28
 [9,]  9 29
[10,] 10 30
[11,] 11 31
[12,] 12 32
[13,] 13 33
[14,] 14 34
[15,] 15 35
[16,] 16 36
[17,] 17 37
[18,] 18 38
[19,] 19 39
[20,] 20 40
z <- rbind(x,y)
z
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
x    1    2    3    4    5    6    7    8    9    10    11    12    13    14
y   21   22   23   24   25   26   27   28   29    30    31    32    33    34
  [,15] [,16] [,17] [,18] [,19] [,20]
x    15    16    17    18    19    20
y    35    36    37    38    39    40
dim(w)
[1] 20  2
dim(z)
[1]  2 20


Data Frames


Data frame é um outro tipo de objeto, como se fosse uma tabela (planilha de Excel, por exemplo). Nos data frames, normalmente as variáveis estão nas colunas e as observações nas linhas. É necessário que todas as colunas tenham o mesmo número de linhas.

É possível usar comandos para juntar objetos do R. Estes comandos podem criar data frames ou matrizes. Exemplo:

d<-data.frame(x,y) #cria um data frame

glimpse(d)
Rows: 20
Columns: 2
$ x <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
$ y <int> 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, …

Normalmente, são utilizados data frames quando os dados são importados para o R. A forma mais simples de se construir um data frame é usar o comando read.table() para ler um conjunto de dados de um arquivo externo.

Quando se tem um data frame e se quer especificar uma coluna específica, seja para visualizar os dados ou fazer alguma estatística descritiva, existem algumas formas para se fazer isto. Uma delas é usando o $. Assim, considerando um data frame chamado mydata2, com diversas variáveis, se a pessoa quiser trabalhar apenas com a variável age (idade na quarta coluna), ele pode usar o comando mydata2$age ou então mydata2[,4].

Uma outra possibilidade é atachar os dados com o comando attach. Assim, attach(mydata2) possibilita o uso direto dos nomes das variáveis que estão nas colunas de mudata2, como por exemplo: summary(educ).

# Uso do Attach
attach(mydata2)

# Depois de Attach
summary(educ)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   12.00   13.00   13.31   16.00   19.00 
# Para desatachar, deve ser usado o comando detach
detach(mydata2)

Quando se cria novos objetos, mesmo que tenham o mesmo nome do que está dentro do data frame, ele não altera o que está dentro do data frame. Assim,

exper <- log(mydata1$exper)

não irá alterar os valores que estão dentro do data frame e irá gerar um novo objeto, fora do data frame. Se quiser alterar o que está dentro do data frame, aí teria que usar o $.

#Antes
summary(mydata1$exper)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    1.0     8.0    11.0    11.4    15.0    22.0 
mydata1$exper <- log(mydata1$exper)

#Depois
summary(mydata1$exper)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   2.079   2.398   2.340   2.708   3.091 

Para apagar uma variável em um data frame existem várias formas:

mydata1$exper <-NULL

summary(mydata1)
    salario           hours             IQ             KWW       
 Min.   : 115.0   Min.   :25.00   Min.   : 54.0   Min.   :13.00  
 1st Qu.: 699.0   1st Qu.:40.00   1st Qu.: 94.0   1st Qu.:32.00  
 Median : 937.0   Median :40.00   Median :104.0   Median :37.00  
 Mean   : 988.5   Mean   :44.06   Mean   :102.5   Mean   :36.19  
 3rd Qu.:1200.0   3rd Qu.:48.00   3rd Qu.:113.0   3rd Qu.:41.00  
 Max.   :3078.0   Max.   :80.00   Max.   :145.0   Max.   :56.00  
      educ           tenure            age              married   
 Min.   : 9.00   Min.   : 0.000   Min.   :28.00   não-casado: 66  
 1st Qu.:12.00   1st Qu.: 3.000   1st Qu.:30.00   casado    :597  
 Median :13.00   Median : 7.000   Median :33.00                   
 Mean   :13.68   Mean   : 7.217   Mean   :32.98                   
 3rd Qu.:16.00   3rd Qu.:11.000   3rd Qu.:36.00                   
 Max.   :18.00   Max.   :22.000   Max.   :38.00                   
     black             south            urban             sibs       
 Min.   :0.00000   Min.   :0.0000   Min.   :0.0000   Min.   : 0.000  
 1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.: 1.000  
 Median :0.00000   Median :0.0000   Median :1.0000   Median : 2.000  
 Mean   :0.08145   Mean   :0.3228   Mean   :0.7195   Mean   : 2.846  
 3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.: 4.000  
 Max.   :1.00000   Max.   :1.0000   Max.   :1.0000   Max.   :14.000  
    brthord           meduc               feduc           lwage      
 Min.   : 1.000   Min.   : 0.000001   Min.   : 0.00   Min.   :4.745  
 1st Qu.: 1.000   1st Qu.: 9.000000   1st Qu.: 8.00   1st Qu.:6.550  
 Median : 2.000   Median :12.000000   Median :11.00   Median :6.843  
 Mean   : 2.178   Mean   :10.828054   Mean   :10.27   Mean   :6.814  
 3rd Qu.: 3.000   3rd Qu.:12.000000   3rd Qu.:12.00   3rd Qu.:7.090  
 Max.   :10.000   Max.   :18.000000   Max.   :18.00   Max.   :8.032  
mydata1 <- mydata1[,-1]
summary(mydata1)
     hours             IQ             KWW             educ      
 Min.   :25.00   Min.   : 54.0   Min.   :13.00   Min.   : 9.00  
 1st Qu.:40.00   1st Qu.: 94.0   1st Qu.:32.00   1st Qu.:12.00  
 Median :40.00   Median :104.0   Median :37.00   Median :13.00  
 Mean   :44.06   Mean   :102.5   Mean   :36.19   Mean   :13.68  
 3rd Qu.:48.00   3rd Qu.:113.0   3rd Qu.:41.00   3rd Qu.:16.00  
 Max.   :80.00   Max.   :145.0   Max.   :56.00   Max.   :18.00  
     tenure            age              married        black        
 Min.   : 0.000   Min.   :28.00   não-casado: 66   Min.   :0.00000  
 1st Qu.: 3.000   1st Qu.:30.00   casado    :597   1st Qu.:0.00000  
 Median : 7.000   Median :33.00                    Median :0.00000  
 Mean   : 7.217   Mean   :32.98                    Mean   :0.08145  
 3rd Qu.:11.000   3rd Qu.:36.00                    3rd Qu.:0.00000  
 Max.   :22.000   Max.   :38.00                    Max.   :1.00000  
     south            urban             sibs           brthord      
 Min.   :0.0000   Min.   :0.0000   Min.   : 0.000   Min.   : 1.000  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.: 1.000   1st Qu.: 1.000  
 Median :0.0000   Median :1.0000   Median : 2.000   Median : 2.000  
 Mean   :0.3228   Mean   :0.7195   Mean   : 2.846   Mean   : 2.178  
 3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.: 4.000   3rd Qu.: 3.000  
 Max.   :1.0000   Max.   :1.0000   Max.   :14.000   Max.   :10.000  
     meduc               feduc           lwage      
 Min.   : 0.000001   Min.   : 0.00   Min.   :4.745  
 1st Qu.: 9.000000   1st Qu.: 8.00   1st Qu.:6.550  
 Median :12.000000   Median :11.00   Median :6.843  
 Mean   :10.828054   Mean   :10.27   Mean   :6.814  
 3rd Qu.:12.000000   3rd Qu.:12.00   3rd Qu.:7.090  
 Max.   :18.000000   Max.   :18.00   Max.   :8.032  


Definindo o diretório de trabalho


Uma questão de extrema importância, que ajuda a organizar os arquivos, é definir um diretório de trabalho. Uma vez definido, a pessoa pode importar arquivos, salvar resultados, etc.

Para isto, são necessários dois comandos. O primeiro é o getwd(), para se verificar o diretório de trabalho atual. O segundo é o setwd(), para você definir qual o diretório quer trabalhar.


Importação de dados - arquivo .csv


Na grande maioria das vezes, os dados seráo importados de arquivos externos. No caso de arquivo .csv, a primeira questão é entender como o arquivo é. Assim, antes de importar, é importante abrir o arquivo, ver se está separado por vírgulas ou ponto e vírgula, se o simbolo decimal é vírgula ou ponto, se possui cabeçalho com os nomes das variáveis, etc.

#Verificando o diretorio que o R esta direcionado
getwd()
[1] "/Users/jricardofl/Dropbox/Facape/2024/20242/Econometria I/econ1_aulaR/aulaR"
#Direcionado o R para o Diretorio a ser trabalhado
setwd('/Users/jricardofl/Dropbox/tempecon/facape/econometria1')

#Inicio do Script
#Leitura dos dados
dados <- read.csv2('multipla.csv', header=T, sep=';', dec='.')

glimpse(dados)
Rows: 23
Columns: 3
$ CLFPR <dbl> 63.8, 63.9, 64.0, 64.0, 64.4, 64.8, 65.3, 65.6, 65.9, 66.5, 66.5…
$ CUNR  <dbl> 7.1, 7.6, 9.7, 9.6, 7.5, 7.2, 7.0, 6.2, 5.5, 5.3, 5.6, 6.8, 7.5,…
$ AHE82 <dbl> 7.78, 7.69, 7.68, 7.79, 7.80, 7.77, 7.81, 7.73, 7.69, 7.64, 7.52…
summary(dados)
     CLFPR            CUNR           AHE82      
 Min.   :63.80   Min.   :4.000   Min.   :7.390  
 1st Qu.:65.05   1st Qu.:5.350   1st Qu.:7.485  
 Median :66.40   Median :6.100   Median :7.690  
 Mean   :65.90   Mean   :6.296   Mean   :7.677  
 3rd Qu.:66.70   3rd Qu.:7.150   3rd Qu.:7.795  
 Max.   :67.20   Max.   :9.700   Max.   :8.140  


Importação de dados - arquivo .xls ou xlsx


No caso de arquivos do Excel (.xls ou xlsx), a forma mais prática é usar o pacote readxl. Veja o help do readxl para maiores informações:

setwd('/Users/jricardofl/Dropbox/tempecon/facape/econometria1')

library(readxl)
custo_cesta <- read_excel("custo_cesta.xlsx")

glimpse(custo_cesta)
Rows: 31
Columns: 3
$ ...1            <dttm> 2018-12-01, 2019-01-01, 2019-02-01, 2019-03-01, 2019-…
$ custo_petrolina <dbl> 303.2811, 297.0438, 318.1675, 341.2856, 338.8838, 352.…
$ tendencia       <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
summary(custo_cesta)
      ...1                        custo_petrolina   tendencia   
 Min.   :2018-12-01 00:00:00.00   Min.   :297.0   Min.   : 1.0  
 1st Qu.:2019-07-16 12:00:00.00   1st Qu.:326.8   1st Qu.: 8.5  
 Median :2020-08-01 00:00:00.00   Median :356.4   Median :16.0  
 Mean   :2020-05-19 03:52:15.48   Mean   :386.2   Mean   :16.0  
 3rd Qu.:2021-03-16 12:00:00.00   3rd Qu.:445.4   3rd Qu.:23.5  
 Max.   :2021-11-01 00:00:00.00   Max.   :482.1   Max.   :31.0  


Salvar os dados


Contudo, se o interesse for em salvar os dados (todos os objetos) para o R:

#Salava todos os objetos do Ambiente Global
save.image("dados.RData")

# No caso de se selecionar apenas alguns objetos para salvar
save(custo_cesta, file="custo_cesta.RData")

# Se os dados forem do próprio R, para importar é usar o ``load`` 
load("custo_cesta.RData")


Explorando os dados e o espaço de trabalho


summary(custo_cesta) # estatísticas descritivas
      ...1                        custo_petrolina   tendencia   
 Min.   :2018-12-01 00:00:00.00   Min.   :297.0   Min.   : 1.0  
 1st Qu.:2019-07-16 12:00:00.00   1st Qu.:326.8   1st Qu.: 8.5  
 Median :2020-08-01 00:00:00.00   Median :356.4   Median :16.0  
 Mean   :2020-05-19 03:52:15.48   Mean   :386.2   Mean   :16.0  
 3rd Qu.:2021-03-16 12:00:00.00   3rd Qu.:445.4   3rd Qu.:23.5  
 Max.   :2021-11-01 00:00:00.00   Max.   :482.1   Max.   :31.0  
str(custo_cesta) #Mostra a estrutura da base de dados
tibble [31 × 3] (S3: tbl_df/tbl/data.frame)
 $ ...1           : POSIXct[1:31], format: "2018-12-01" "2019-01-01" ...
 $ custo_petrolina: num [1:31] 303 297 318 341 339 ...
 $ tendencia      : num [1:31] 1 2 3 4 5 6 7 8 9 10 ...
glimpse(custo_cesta) # Mostra a estrutura da base de dados
Rows: 31
Columns: 3
$ ...1            <dttm> 2018-12-01, 2019-01-01, 2019-02-01, 2019-03-01, 2019-…
$ custo_petrolina <dbl> 303.2811, 297.0438, 318.1675, 341.2856, 338.8838, 352.…
$ tendencia       <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
names(custo_cesta) # Lista as variaveis na base de dados
[1] "...1"            "custo_petrolina" "tendencia"      
head(custo_cesta) # 6 primeiras linhas da base de dados
head(custo_cesta, n=5) # 10 primeiras linhas da base de dados
head(custo_cesta, n= -10) # Todas as linhas menos as 10 últimas
tail(custo_cesta) # 6 últimas linhas
tail(custo_cesta, n=10) # 10 últimas linhas
tail(custo_cesta, n= -10) # Todas as linhas menos as 10 primeiras
length(custo_cesta) # verificando o tamanho do objeto
[1] 3
custo_cesta[1:10, ] # 10 primeiras linhas
custo_cesta[1:10,1:2] # 10 primeiras linhas das 2 primeiras variáveis


Ferramentas para tratamento de dados


Parte significante do trabalho de análise de dados envolve trabalhar bases brutas e transformá-las em formatos mais interessantes. O R já vem com ferramentas para isso, mas elas não são tão eficientes quanto as disponibilizadas no pacote dplyr. A ideia do dplyr é oferecer uma gramática dos dados, uma maneira concisa e clara de manipulá-los. flights vai carregar a base com os vôos:

library(nycflights13)
library(tidyverse)

flights

filter() te permite selecionar subconjuntos dos seus dados baseado em seus valores. O primeiro argumento é sempre um objeto data.frame, os subsequentes são argumentos lógicos que selecionem o que você quer:

filter(flights, month == 1, day == 1)
# Para armazena-lo
dados.filtrados <- filter(flights, month == 1, day == 1)

# Uso do "ou" "|"
filter(flights, month == 11 | month == 12)
#Outra possibilidade, armazenando
nov_dec <- filter(flights, month %in% c(11, 12))

arrange() funciona de maneira similar, mas ao invés de escolher pedaços dos dados, altera sua ordem. Alimentamos sempre um objeto data.frame e depois dizemos - em ordem - quais variáveis devem ser usadas para ordenação:

arrange(flights, year, month, day)

É comum trabalhar com bases de dados que tenham centenas ou mesmo milhares de variáveis. Para isso pode-se usar select() e simplificar a tarefa.

# selecionando colunas por nome
select(flights, year, month, day)
  • Para renomear variáveis usa-se rename()
rename(flights, tail_num = tailnum)

É comum precisar criar variáveis e isso pode ser feito com mutate(), que sempre irá adicionar a variável que especificarmos ao final do data.frame. Vamos gerar um objeto desssa classe, menor, e depois introduzir duas variáveis, gain que será a diferença dos atrasos de partida e chegada e speed, a velocidade média do vôo.

base <- select(flights,
 year:day,
 ends_with("delay"),
 distance,
 air_time)
mutate(base,
 gain = arr_delay - dep_delay,
 speed = distance / air_time * 60)

Se você quer somente as variáveis geradas, então use transmute():

transmute(flights,
 gain = arr_delay - dep_delay,
 hours = air_time / 60)


Operador Pipe


Pipes (|>) (ou tubos) são uma ferramenta poderosa para expressar claramente uma sequência de várias operações. Pipes (|>), são carregados através do pacote magrittr. O objetivo do pipe é ajudá-lo a escrever código de uma maneira que seja mais fácil de ler e entender.

library(tidyverse)
library(magrittr)

diamonds <- ggplot2::diamonds
diamonds2 = mutate(diamonds, price_per_carat = price / carat)

summary(diamonds2$price_per_carat)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1051    2478    3495    4008    4950   17829 
# E agora usando o `pipe`:

diamonds3 <- diamonds |> 
  dplyr::mutate(price_per_carat = price / carat)

summary(diamonds3$price_per_carat)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1051    2478    3495    4008    4950   17829 
library(babynames) # data package
library(dplyr)     # funções para manipular dados.
library(magrittr)  # para o pipe
library(ggplot2)   # para o gráfico

babynames |>
    filter(name |> substr(1, 3) == "Ste") |>
    group_by(year, sex) |>
    summarize(total = sum(n)) |>
    ggplot2::ggplot(ggplot2::aes(x = year, y = total, colour = sex)) +
  ggplot2::geom_line(size = 1) +
  ggplot2::labs(title = "Nomes começando com Ste",
                x = "Anos",
                y = "Total")

    print
function (x, ...) 
UseMethod("print")
<bytecode: 0x7fd079662a18>
<environment: namespace:base>


A sequência de códigos contida no pipe pode ser descrita como uma espécie de receita:

  1. pegue os dados do bebê e depois
  2. filtre-o de modo que o nome da sub-string do caractere 1 a 3 seja igual a “Ste” e, em seguida,
  3. agrupe-o por ano e sexo, depois
  4. resuma-o calculando a soma total de cada grupo e, em seguida,
  5. traçar os resultados, colorindo por sexo, depois
  6. adicione um título e, em seguida,
  7. imprima na tela.

O exemplo ilustra alguns recursos do |>. Em primeiro lugar, as funções dplyr filter, group_by e summarise, todos tomam como primeiro argumento um objeto de dados e, por padrão, é onde o |> o colocará no seu lado esquerdo.

Os dados de nomes de bebês são inseridos como primeiro argumento na chamada para filter. Quando a filtragem é concluída, o resultado é passado como o primeiro argumento para group_by e da mesma forma para summarise.

No entanto, nem sempre é uma sorte que uma função seja projetada para aceitar os dados (ou o que quer que você esteja transmitindo) como seu primeiro argumento (as funções dplyr são projetadas com |> de operações em mente). É o caso de, por exemplo, qplot, mas observe os dados =. argumento. Isso indica a |> para colocar o lado esquerdo lá, e não como o primeiro argumento. Essa é uma maneira simples e natural de acomodar a falta de consistência das assinaturas de funções e permite que o lado esquerdo vá para qualquer lugar da chamada no lado direito.

Além disso, print é usada sem parênteses; isso é para tornar o código ainda mais limpo quando apenas um lado esquerdo for necessário como entrada. Por fim, observe que |> pode ser usado de forma aninhada (uma cadeia separada é encontrada na chamada de filter) e que o magrittr possui aliases para operadores comumente usados, como adicionar para + e igual a == usado acima. Isso torna as cadeias de pipes mais legíveis (não necessariamente menores).


Outros exemplos com Pipe


Imagine que estamos procurando uma relação entre algumas variáveis dos dados:

por_distancia <- group_by(flights, dest)
atraso <- summarize(por_distancia,
 count = n(), dist = mean(distance, na.rm = TRUE),
 delay = mean(arr_delay, na.rm = TRUE))
delay <- filter(atraso, count > 20, dest != "HNL")

ggplot(data = delay, mapping = aes(x = dist, y = delay)) +
 geom_point(aes(size = count), alpha = 1/3) +
 geom_smooth(se = FALSE)

Foi feita uma sequência de passos grande e facilmente algo poderia ter saído errado. Além de que, qualquer alteração em uma linha de código provavelmente vai exigir que se altere em outras. Resolvemos isso com o operador |>, o Pipe. Entenda ele como um cano, que “engata” funções.

atrasos <- flights |>
 group_by(dest) |>
 summarize(count = n(), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) |>
 filter(count > 20, dest != "HNL")

Um código muito mais legível e rápido. Note que o pipe deve ser posto sempre como o sinal positivo em gráficos do ggplot2. Voltando aos dados, pode-se querer cruzar atrasos com números de vôos no dia.

nao_cancelados <- flights |>
 filter(!is.na(dep_delay), !is.na(arr_delay))
atrasos <- nao_cancelados |>
 group_by(tailnum) |>
 summarize(delay = mean(arr_delay, na.rm = TRUE),
 n = n())
ggplot(data = atrasos, mapping = aes(x = n, y = delay)) +
 geom_point(alpha = 1/10)

Talvez não seja muito interessante manter na nossa análise exploratória dados de dias com pouquíssimos vôos - já que tendem a ser anômalos. Com um pipe, isso vira uma breve alteração no código:

atrasos |>
 filter(n > 25) |>
 ggplot(mapping = aes(x = n, y = delay)) +
 geom_point(alpha = 1/10)